#pragma once
#include <filesystem>
#include <fstream>
#include <string>
#include <memory>
#include <fmtlog/fmtlog.h>


namespace MY_MQ{
    class Filehelper {
    std::string _file_name;
public:
    Filehelper(const std::string& file_name) : _file_name(file_name) {
    }
    //提供成员函数，存在判断，是否目录判断，重命名，读写，文件大小获取
    bool exists() const {
        return std::filesystem::exists(_file_name);
    }
    bool is_directory() const {
        return std::filesystem::is_directory(_file_name);
    }
    bool rename(const std::string& new_name) {
        std::filesystem::rename(_file_name, new_name);
        _file_name = new_name;
        return exists();
    }

    //二进制追加写
    bool writeBinary (const char* content, std::size_t offset,std::size_t size)
    {
        std::ofstream file(_file_name, std::ios::binary | std::ios::out);
        //检查打开是否失败，并且显示错误原因
        if (!file.is_open()) {
            //获取错误原因
            std::string error = std::strerror(errno);
            logw("Failed to open file {}: {}", _file_name, error);
            return false;
        }
        file.seekp(offset);
        file.write(content, size);
        file.close();
        return true;
    }
    //二进制追加读
    bool read(char* content, std::size_t offset, std::size_t size) const{
        std::ifstream file(_file_name, std::ios::binary | std::ios::in);
        if (!file.is_open()) {
            std::string error = std::strerror(errno);
            logw("Failed to open file {}: {}", _file_name, error);
            return false;
        }
        file.seekg(offset);
        file.read(content, size);
        file.close();
        return true;
    }

    //基于二进制读取，将其读取为字符串
    bool read_as_string(std::string& content) const {
        content = std::string(size(),0); //分配足够的空间
        if (!read(content.data(), 0, size())) {
            return false;
        }
        return true;
    }

    //基于二进制写入，将字符串写入文件
    bool write(std::string content) {
        return writeBinary((char*)content.c_str() ,0 ,content.size());
    }

    std::size_t size() const {
        return std::filesystem::file_size(_file_name);
    }
    
    //提供静态方法创建目录，删除目录，创建文件，删除文件
    static bool create_directory(const std::string& dir_name) {
        return std::filesystem::create_directory(dir_name);
    }

    static bool remove_directory(const std::string& dir_name) {
        return std::filesystem::remove_all(dir_name);
    }

    static bool create_file(const std::string& file_name) {
        std::ofstream file(file_name, std::ios::out);
        if(!file.is_open()){
            file.close();
            return false;
        }
        file.close();
        return true;
    }
    static bool remove_file(const std::string& file_name) {
        return std::filesystem::remove(file_name);
    }
};
};